class Solution {
    public int longestPalindromeSubseq(String s) {
        // 创建dp表、初始化、填表、返回值
        int n = s.length();
        char[] ss = s.toCharArray();
        int[][] dp = new int[n][n];

        // 无需初始化

        for (int i = n-1; i >= 0; i--) {
            for (int j = i; j < n; j++) {
                if (ss[i] == ss[j]) {
                    if (i == j) {
                        dp[i][j] = 1;
                    } else if (i+1 == j) {
                        dp[i][j] = 2;
                    } else {
                        dp[i][j] = dp[i+1][j-1] + 2;
                    }
                } else {
                    dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }

        // 返回的是 [0,n-1] 区间内，最长子序列的长度
        return dp[0][n-1];
    }
}